import java.util.ArrayList;
import java.util.List;

/**
 * @program: LeetCode
 * @description: LeetCode : 501. 二叉搜索树中的众数
 * @author: WXY
 * @create: 2023-01-17 20:13
 * @Version 1.0
 **/
public class Num501_findMode {
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    List<Integer> list = new ArrayList<Integer>();
    int base,count,maxCount;

    public int[] findMode(TreeNode root) {
        process(root);
        int[] ans = new int[list.size()];
        for (int i = 0; i < ans.length; i++) {
            ans[i] = list.get(i);
        }
        return ans;
    }

    private void process(TreeNode root) {  //中序遍历是一个递增的序列，
        if (root == null)return;
        process(root.left);
        update(root.val);
        process(root.right);

    }
    //中序遍历是一个递增的序列，如果当前的数不能等于前一个数，说明前一个数的计数结束了,要开始新的计数
    //如果当前数的计数等于maxCount , 说明有多个众数，都加到list中，
    //如果当前数的计数大于maxCount ，说明出现了新的众数，前面记录都不是，需将list清空，重新添加到list

    private void update(int val) {
        if (val == base) {
            count++;
        } else {
            count = 1;
            base = val;
        }
        if (count == maxCount) {
            list.add(val);
        }
        if (count > maxCount) {
            maxCount = count;
            list.clear();
            list.add(base);
        }
    }

}
